iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

前言

Day18的時候我介紹了Intent頁面跳轉,並且結合了登入畫面按下登入後會去比對帳號跟密碼,接著當帳密是正確的時候就進行跳轉頁面的動作,當時我使用的是一種非常簡陋的方法存取帳密,且當時我也提到更正確的方法應該要使用Room或SharedPreference這種資料庫來存取會更好,因此今天就來好好講解一下SharedPreference的使用方法,會使用Day18做的實作進行修改。

布局設定

這次以Day18為基底增加了CheckBox這個物件,這個物件就相當於在登入介面中常見的「是否記住帳號資訊」,或是註冊介面會看到的「我不是機器人」,我可以將CheckBox跟Button做結合,在按下我不是機器人之前,按鈕不管怎麼按都沒辦法觸發
https://ithelp.ithome.com.tw/upload/images/20231004/20161500FN33RnpF6E.png
在上面搜尋checkbox或者在Buttons分類中找到

  • register_dialog

https://ithelp.ithome.com.tw/upload/images/20231004/20161500dvs88hGrzE.png
這次實作新增了一個ChcekBox

SharedPreference

SharedPreference有分兩種使用方式:

  • getSharedPreferences
  • getPreferences

getSharedPreferences,在設定時需要指定一個文件名稱用來存取資料,就相當於Key的功用,也因此使用getSharedPreferenece使用SharedPreference時可以寫在class裡面,用方法將資料存取、取出,透過這種方式就可以讓不同的Activity調用從其他Activity存取的資料,也是本次實作會使用的方法。

getPreference,使用這個方法時可以不用指定文件名稱,直接使用getActivity指定存取的地方,但也因為這個特性所以會讓其他Activity無法調用資料,因此這個方法通常只會用在Activity中存取及調用資料。

存取資料的方式兩種方法都是相同的,下面就介紹怎麼使用第一個方法

  • MySharedPreference

首先建立一個class取名為MySharedPreference
宣告SharedPreference以及SharedPreference的Editor,再建立一個建構元

    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor editor;
    private String act = "account";
    private String pwd = "password";
    
    public MySharedPreference(Context context){
        sharedPreferences = context.getSharedPreferences(context.getResources().getString(R.string.app_name),Context.MODE_PRIVATE);
        editor = sharedPreferences.edit();
    }

這裡設定初始化SharedPreference時要傳入那個Activity的Context,接著要綁定SharedPreference,前面的參數要填入文件名稱(Key)
context.getResources().getString(R.string.app_name)讀取的是專案的名稱,如果沒有要做特別的分類使用專案名稱就可以了
接著後面的Context.MODE_PRIVATE設定這個SharedPreference的模式為只能讓現在這個App進行存取及讀取的動作,原本還有另外兩個模式可使用,但在API版本17開始將另外兩個模式廢棄了,這邊就不多做介紹詳細可以參考這個文章使用 SharedPreferences 保存简单数据
最後editor,就是SharedPreference的編輯器,在存取資料時需要使用到這個

  • 存取資料

    public void setAccount(String account){ editor.putString(act,account).commit(); }
    public void setPassword(String password){ editor.putString(pwd,password).commit(); }

存取資料時要使用editor裡面的put方法
https://ithelp.ithome.com.tw/upload/images/20231004/201615001BRvnDIfnf.png
依據資料的型態用不同方法存取,這次實作只會用到String所以這邊就選擇使用putString()
接著要傳入Key跟Value,Key就自己隨意設定,Value的部分可以設定調用這個方法時需要傳入String,再將傳入的String當成Value傳入即可
最後最重要的是要commit,commit過後才會將資料更新。

  • 補充 : 除了commit還可以選擇使用apply,兩個的差別在於前者會同步進行資料的修改,但是有機會影響到主線程,後者則是非同步更改資料。

  • 讀取資料

    public String getAccount(){ return sharedPreferences.getString(act,""); }
    public String getPassword(){ return sharedPreferences.getString(pwd,""); }

讀取資料的方法如上,因應不同資料的型態就要get不同的形態,這邊因為存取的都是String所以這裡就使用getString來抓取資料,參數則要往裡面傳入Key跟如果沒有抓到資料的話要回傳的內容,所以這裡就是沒抓到資料就傳一個空值回去。

以上就完成了SharedPreference的設定啦~可喜可賀‧★,::‧( ̄▽ ̄)/‧:‧°★*

LoginActivity

這次就針對有做修改的地方講解

  • 宣告

    private CheckBox checkBox;
    private MySharedPreference mySharedPreference;
  • 初始化

    mySharedPreference = new MySharedPreference(this);
  • CheckActPwdData

    private void checkActPwdData(String act, String pwd) {
        String account = mySharedPreference.getAccount();
        String password = mySharedPreference.getPassword();

        if (act.equals(account) && pwd.equals(password)){
            Intent intent = new Intent();
            intent.setClass(this, MainActivity.class);
            startActivity(intent);
        }
        else{
            Toast.makeText(this,"帳號或密碼有誤",Toast.LENGTH_SHORT).show();
            et_account.setText("");
            et_password.setText("");
        }
    }

這裡改成向SharedPreference要取帳號跟密碼的資料,然後去比對是否相同,是就跳轉到主頁面否就清除輸入並且用Toast提醒。

  • setDialog

    checkBox = dialog.findViewById(R.id.checkBox);

因為CheckBox是在Dialog上,所以綁定id的部分也要寫在這裡

    create.setEnabled(false);
    checkBox.setChecked(false);

這邊設計成在CheckBox被勾選前Button為無法點擊的狀態,並且將CheckBox設定為未被勾選的狀態,避免註冊完帳號又再按一次註冊時CheckBox會因為沒有重製而顯示勾選狀態

        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if (checkBox.isChecked()) create.setEnabled(true);
                else create.setEnabled(false);
            }
        });

CheckBox通常都會使用setOnCheckedChangeListener來偵測勾選的狀態,這裡設定當CheckBox為勾選狀態時,就讓create按鈕變回可點選狀態,反之就變回不可點選狀態

create.setOnClickListener(view -> {
            if (register_act.getText().toString().isEmpty() || register_pwd.getText().toString().isEmpty()){
                Toast.makeText(this,"帳號或密碼不能為空",Toast.LENGTH_SHORT).show();
            }
            else{
                mySharedPreference.setAccount(register_act.getText().toString());
                mySharedPreference.setPassword(register_pwd.getText().toString());
                register_act.setText("");
                register_pwd.setText("");
                dialog.dismiss();
            }
        });

最後create的部分,這裡額外設計了檢測帳密不得為空,避免有什麼奇怪的事發生
如果有輸入就呼叫SharedPreference的設定帳號跟密碼的方法,並且傳入相關的資料。

成果展示

SharedPreference的介紹就到這邊,下一篇會介紹CareView,這是一個可以結合RecyclerView的物件。


上一篇
【DAY 23】 SeekBar介紹
下一篇
【DAY 25】 CardView介紹
系列文
Android Studio開發過程和介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言